package com.gucheng.aigc.manager;


import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.exception.SparkException;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import io.github.briqt.spark4j.model.response.SparkTextUsage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class BiManager {
    SparkClient basesparkClient=new SparkClient();
    {
        basesparkClient.appid="你的讯飞星火应用id";
        basesparkClient.apiKey="你的讯飞星火应用key";
        basesparkClient.apiSecret="你的讯飞星火应用Secret";
    }

    public String doChat(String message) {

        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent("  \"你是一个经验丰富的数据分析师和前端开发专家。以下是你将接收的内容格式：\\n\" " +
                "分析需求：\n" +
                "{数据分析的需求或者目标}\n" +
                "原始数据：\n" +
                "{提供CSV格式的原始数据，用,作为分隔符}\n" +
                "请根据这两部分内容，严格按照以下格式生成输出，内容包含“#####”（此外不要输出任何多余的开头、结尾、注释）\n" +
                "#####\n" +
                "请生成一个前端Echarts V5的option配置对象的精确JSON代码，确保数据可视化无多余内容，比如注释。图表类型应与数据和需求相匹配，各系列数据应完整，文本信息应正确，JSON格式应规范，且反映原始数据特有格式和结构。\n\n" +
                "提供一个折线图的示例：\n" +
                "{\n" +
                "    \"xAxis\": {\n" +
                "        \"type\": \"category\",\n" +
                "        \"data\": [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\n" +
                "    },\n" +
                "    \"yAxis\": {\n" +
                "        \"type\": \"value\"\n" +
                "    },\n" +
                "    \"series\": [{\n" +
                "        \"data\": [150, 230, 224, 218, 135, 147, 260],\n" +
                "        \"type\": \"line\"\n" +
                "    }]\n" +
                "}\n\n" +
                "根据需求和数据，生成相应的Echarts V5的option配置对象的JSON代码，注意，上面只是折线图的示例，请根据Echarts V5的option配置要求生成对应的JSON代码。"
                +
                "#####\n" +
                "{提供详细的数据分析结论，确保分析的深度和准确性，不包含任何注释或多余文字}"));
        messages.add(SparkMessage.userContent(message));
// 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
// 消息列表
                .messages(messages)
// 模型回答的tokens的最大长度,非必传，默认为2048。
// V1.5取值为[1,4096]
// V2.0取值为[1,8192]
// V3.0取值为[1,8192]
                .maxTokens(4096)
// 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.5)
// 指定请求版本，默认使用最新3.5版本
                .apiVersion(SparkApiVersion.V4_0)
                .build();
        String result ="";
        String useToken = " ";
        try {
            // 同步调用
            SparkSyncChatResponse chatResponse = basesparkClient.chatSync(sparkRequest);
            SparkTextUsage textUsage = chatResponse.getTextUsage();
            result = chatResponse.getContent();
            useToken = "提问tokens：" + textUsage.getPromptTokens()
                    + "，回答tokens：" + textUsage.getCompletionTokens()
                    + "，总消耗tokens：" + textUsage.getTotalTokens();
            log.info(useToken);
        } catch (SparkException e) {
            log.error("Ai调用发生异常了：" + e.getMessage());
        }
        return result;
    }

}
